【问题标题】:Why is my list modified in the function but not the variable? [duplicate]为什么我的列表在函数中被修改而不是变量? [复制]
【发布时间】:2021-05-18 07:09:36
【问题描述】:

考虑以下代码:

def test(Tlist):
    Tlist.sort(reverse=True)

Tlist=[0.02,0.1,4,35]
print(Tlist)# [0.02, 0.1, 4, 35]
test(Tlist)
print(Tlist)# [35, 4, 0.1, 0.02]

def test2(a):
    a+=1

a=0
print(a)# 0
test2(a)
print(a)# 0

让我困惑的是,在第一个函数测试中,列表 Tlist 正在被修改。但是在函数test2中,变量a不是。

但从概念上讲,两者都作为参数发送给我的函数。我不明白为什么要修改列表?我认为将变量发送到函数的参数会导致该变量不会在函数内全局更改。

【问题讨论】:

  • Tlist.sort mutates Tlist 对象,其中只有一个,因此任何持有该对象引用的人都可以看到更改。 a+= 为局部变量a 分配了一个新值,该值仅在函数内部可见。
  • @Anonymous “按值传递”或“按引用传递”不适用于此处。使用a += 1,您可以将名称a 重新绑定到一个新值。原值a 被绑定到不会改变。

标签: python scope global-variables


【解决方案1】:

sort 函数修改输入列表本身。

>>> a = [1,2,3,5,1000,12]
>>> a.sort()
>>> a # original list changes
[1, 2, 3, 5, 12, 1000]

>>> a = [1,2,3,4,100,1000, 12]
>>> x = sorted(a)
>>> a #original list no change
[1, 2, 3, 4, 100, 1000, 12]
>>> x  
[1, 2, 3, 4, 12, 100, 1000]

【讨论】:

  • 这如何回答 OP 的问题?
  • 我的意思是如果在该列表上使用排序而不是排序,那么原始列表不会被修改。让我编辑我的答案
猜你喜欢
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多