V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2022-01-15 10:40:25 +08:00 · 2741 次点击
    这是一个创建于 1039 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为甚么不能直接给不定长位置参数*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 条回复    2022-01-16 15:11:41 +08:00
    JeffGe
        1
    JeffGe  
       2022-01-15 10:50:36 +08:00 via Android
    你可以定义这个的
    def sum(iterable): ...

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

    就是语言为了实现上的简单性,没有做这个转换而已。
    我不记得有没有语言会做这个转换的,只能强行举个无关的 `*` 号的例子。golang 里面 (*(*x).y).z 可以简写成 x.y.z (指针自动解引用)。 `sum(my_tuple)` 理论上也可以自动转成 `sum(*my_tuple)`,只是 Python 没有做而已。
    pursuer
        8
    pursuer  
       2022-01-15 16:42:57 +08:00
    @weakish 匹配和自动转换通常要语言有类型系统才行,类似 Java 和 C++的重载。Python 没类型系统,Type Hints 也是后面加的不能影响这种原先设计的语法,自动转换无法避开我上面提到的传参时的歧义。当然函数实现者还是可以通过 type(args[0])判断并做自动转换。
    deplivesb
        9
    deplivesb  
       2022-01-16 15:11:40 +08:00
    二楼已解
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5563 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 06:36 · PVG 14:36 · LAX 22:36 · JFK 01:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.