Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3列表上的奇数函数行为_Python_Python 3.x_Scope - Fatal编程技术网

Python3列表上的奇数函数行为

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

因此,我正在使用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(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]