Python3列表上的奇数函数行为
因此,我正在使用python 3.3中的列表,下面是我的示例代码:Python3列表上的奇数函数行为,python,python-3.x,scope,Python,Python 3.x,Scope,因此,我正在使用python 3.3中的列表,下面是我的示例代码: def change_to_z(lis): lis[3] = 'z' def change_to_k(lis): lis[4] = 'k' def split(lis): lis = lis[3:] + lis[:3] totest = ['a', 'b', 'c', 'd', 'e', 'f'] change_to_z(totest) print(totest) change_to_k(tot
def change_to_z(lis):
lis[3] = 'z'
def change_to_k(lis):
lis[4] = 'k'
def split(lis):
lis = lis[3:] + lis[:3]
totest = ['a', 'b', 'c', 'd', 'e', 'f']
change_to_z(totest)
print(totest)
change_to_k(totest)
print(totest)
split(totest)
print(totest)
以及输出:
['a', 'b', 'c', 'z', 'e', 'f']
['a', 'b', 'c', 'z', 'k', 'f']
['a', 'b', 'c', 'z', 'k', 'f']
请注意,当我调用前两个函数时,我可以修改列表,而totest总是引用列表,即使列表已更改
但是,对于第三个函数,变量totest不再引用列表的最新修改版本。我的调试器告诉我,在函数“split”中,列表是翻转的,但在函数外部,列表不是翻转的。为什么变量名不再引用列表
为什么会发生这种情况?这是由什么运营商造成的?为什么有时变量名在函数中修改后仍然引用列表,但在其他运算符中却不是这样 关于函数的
范围
您错了
如果确实要更改提供的列表,可以尝试以下两种方法之一
def split(lis):
global lis
lis = lis[3:] + lis[:3]
或者更好
def split(lis):
lis[:] = lis[3:] + lis[:3] # Credits go to drewk for pointing this out
当你在做
def split(lis):
lis = lis[3:] + lis[:3]
在split
功能中,您正在创建一个本地列表,其标识符与所提供列表的标识符相同。但是,这两者不会冲突,因为传递的列表是全局的
如果你想玩游戏并知道它们是否真的不同,请使用id()
上述代码的输出
40785920
40785600
请注意内存位置是如何不同的对
lis
的赋值是一个局部变量,不会更新列表。这很容易在您的程序中看到
另外,请参阅,以获取有关发生的情况的清晰解释。这里有一个简短的回顾:
- 名称指的是值
- 多个名称可以引用一个值
- 名称将独立于其他名称重新分配
- 分配从不复制数据
- 值中的更改通过其所有名称都可见
- Python以不同的方式分配可变值和不可变值
- 引用可以不仅仅是名称
def split(lis):
global lis
lis = lis[3:] + lis[:3]
将函数中的
lis=lis[3::+lis[:3]
更改为lis[:]=lis[3:+lis[:3]
def split(lis):
global lis
lis = lis[3:] + lis[:3]