GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing notes.kamacoder.com — Python函数参数是值传递还是引用传递?对象共享传递与可变对象修改 # Python函数参数是值传递还是引用传递?面试官问:"Python函数传参是值传递还是引用传递?" 这题最容易答成"Python一切都是引用传递",但这个说法并不准确。真正要讲清楚的是:函数拿到的是同一个对象的引用副本,参数重新绑定和修改可变对象不是一回事。 # 简要回答Python采用的是对象共享传递(call by object reference / call by sharing),不是传统意义上的值传递或引用传递。 调用函数时,形参会绑定到实参指向的同一个对象。这带来两个行为: 重新绑定形参不会影响外部变量。函数内执行 通过形参修改可变对象,会影响外部看到的同一个对象。函数内执行 # 详细回答# 函数调用时发生了什么Python中,变量是名字,对象独立存在。调用函数时:
形参与实参绑定同一个对象,不是复制对象内容,也不是传递变量本身的地址。
# 重新绑定不会修改外部对象 1 2 3 4 5 6 函数内 # 修改可变对象会影响外部 1 2 3 4 5 6
# 不可变对象的行为对于不可变对象(整数、字符串、元组),函数内尝试修改时,Python实际上创建了新对象: 1 2 3 4 5 6 7 8
# 常见错误:以为传的是变量本身 1 2 3 4 5 6
# 知识拓展Q1:为什么不说"引用传递"? 传统的引用传递(如C++中的 Q2:如何让函数修改外部的不可变对象? 不可变对象本身不能被修改,可以把它包在可变容器里: 1 2 3 4 5 6 或者直接返回新值: 1 2 3 4 Q3: 可以。 Q4:函数参数会复制对象内容吗? 不会。无论对象多大,传参只是复制引用(一个指针),不复制对象本身。这也是为什么传递大列表或大字典不会有性能问题。 Q5:如何避免函数意外修改可变参数? 函数内先复制一份: 1 2 3 4 或者明确在调用时传副本: 1 评论验证登录状态... |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |