推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
AnnanAngel
V2EX  ›  Python

为甚么不能直接给不定长位置参数*args 传递一个元组类型的实参呢??

  •  
  •   AnnanAngel · Jan 15, 2022 · 3703 views
    This topic created in 1727 days ago, the information mentioned may be changed or developed.

    为甚么不能直接给不定长位置参数*args 传递一个元组类型的实参呢??,它的本质不就是一个元组类型的形参嘛,为什么不能直接传递一个元组,反而还要进行拆包操作,才能传递

    def sum(*args):
        sum = 0
        for num in args:
            sum = sum + num
        print('sum', sum, sep='=')
    
    
    my_tuple = (1, 2, 3, 4)
    
    
    sum(*my_tuple)
    #*my_tuple 表示拆包操作,如果不拆包直接传递元组本身的引用,就会报错
    
    9 replies  •  2022-01-16 15:11:41 +08:00
    JeffGe
        1
    JeffGe  
       Jan 15, 2022 via Android
    你可以定义这个的
    def sum(iterable): ...

    iterable 可以给任何可迭代对象
    pursuer
        2
    pursuer  
       Jan 15, 2022   ❤️ 7
    这是有语义上的差异的。函数可以接受不定长参数,你传一个元组,函数要如何区分你要把元组作为一个变长参数的第一个参数,还是要把元组拆成变参的参数?
    zhy0216
        3
    zhy0216  
       Jan 15, 2022
    因为 sum(1, 2, 3) 比 sum((1, 2, 3)) 好看些
    StevenRCE0
        4
    StevenRCE0  
       Jan 15, 2022
    既然你都理解它的本质了,其实就已经知道为什么是这样的……
    iPhone12
        5
    iPhone12  
       Jan 15, 2022
    2 楼正解,此帖终结。
    weakish
        6
    weakish  
       Jan 15, 2022
    @pursuer 可以匹配呀,就看语言设计的取舍了,愿不愿意做复杂的解析逻辑。
    weakish
        7
    weakish  
       Jan 15, 2022
    > 如果不拆包直接传递元组本身的引用,就会报错

    就是语言为了实现上的简单性,没有做这个转换而已。
    我不记得有没有语言会做这个转换的,只能强行举个无关的 `*` 号的例子。golang 里面 (*(*x).y).z 可以简写成 x.y.z (指针自动解引用)。 `sum(my_tuple)` 理论上也可以自动转成 `sum(*my_tuple)`,只是 Python 没有做而已。
    pursuer
        8
    pursuer  
       Jan 15, 2022
    @weakish 匹配和自动转换通常要语言有类型系统才行,类似 Java 和 C++的重载。Python 没类型系统,Type Hints 也是后面加的不能影响这种原先设计的语法,自动转换无法避开我上面提到的传参时的歧义。当然函数实现者还是可以通过 type(args[0])判断并做自动转换。
    deplivesb
        9
    deplivesb  
       Jan 16, 2022
    二楼已解
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1012 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 18:43 · PVG 02:43 · LAX 11:43 · JFK 14:43
    ♥ Do have faith in what you're doing.