Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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
Python 为什么它需要函数中的[:](冒号)来在全局范围内改变列表?_Python_Python 3.x_List_Function_Copy - Fatal编程技术网

Python 为什么它需要函数中的[:](冒号)来在全局范围内改变列表?

Python 为什么它需要函数中的[:](冒号)来在全局范围内改变列表?,python,python-3.x,list,function,copy,Python,Python 3.x,List,Function,Copy,我试图通过将列表作为参数传递给函数来找到一种改变列表的解决方案。例如: def f(x): x = x*2 x = [9,8,7] f(x) print(x) 我希望结果是: [9, 8, 7, 9, 8, 7] 但结果是这样的: [9, 8, 7] 然后我被这条线绊倒了: 这个解决方案非常有效 def f(x): x[:] = x*2 x = [9,8,7] f(x) print(x) [9, 8, 7, 9, 8, 7] 我的问题是为什么我们需要[:]?我认为这是另

我试图通过将列表作为参数传递给函数来找到一种改变列表的解决方案。例如:

def f(x):
    x = x*2
x = [9,8,7]
f(x)
print(x)
我希望结果是:

[9, 8, 7, 9, 8, 7]
但结果是这样的:

[9, 8, 7]
然后我被这条线绊倒了:

这个解决方案非常有效

def f(x):
    x[:] = x*2
x = [9,8,7]
f(x)
print(x)

[9, 8, 7, 9, 8, 7]
我的问题是为什么我们需要[:]?我认为这是另一种方式,如果我们不想改变原始列表,我们在它后面放[:]来复制它。但这一次似乎正好相反。它可能与全局和功能范围有关。我试着用蟒蛇,但仍然感到困惑

谢谢大家!


编辑:分号->冒号

这是浅拷贝和深拷贝的概念,通过这样的列表[:]将创建列表的一部分,并将原始列表的所有引用分配给创建的新副本。参考文档了解更多详细信息,我已添加了链接。
让我知道这是否有助于兄弟

正如其他答案所说:这种行为是由函数范围和全局范围引起的。为了清楚起见,让我们在函数中调用局部x到x,而在另一个函数中调用全局x。将全局x值作为参数传递给f函数,然后使用其值创建一个新变量local x,第二个变量与第一个变量不相关,因为它只存在于函数内部,无法在函数外部调用,如果将局部x重命名为y,则不会遇到这种混乱,如下所示:

def f(x):
    y = x*2
    print(f'Inside function: {y}')
x = [9,8,7]
f(x)
print(f'Global x: {x}')
输出:

Inside function: [9, 8, 7, 9, 8, 7]
Global x: [9, 8, 7]
另一方面,使用x[:]您实际上指向全局x,这就是您可以使用y而不是局部x打印其值的原因,您将得到如下错误:

Traceback (most recent call last):
File [file_name], line 6, in <module>
print(f'Global x: {y}')
NameError: name 'y' is not defined

这不是分号。您是否忘记从函数返回它?请注意,在第一种情况下,您只是将变量x重新指定给其他变量x*2创建了一个新列表。谢谢。我仍然很困惑,为什么要把[:]放在x上才能变异?这是因为若你们不这样做,那个么只有一个对象的值会被改变,它只会在那个函数范围内可见,不会在实际对象中得到反映。但当[:]这个被放置时,它创建了一个对象,并且被改变了。尝试对可变和不可变对象进行切片,这样会变得清晰