为什么此参数列表没有';Python中没有变化吗?
我创建了一个函数f,它使用一个二维列表作为参数,但是在这个函数之后,列表一点也没有改变。 代码如下:为什么此参数列表没有';Python中没有变化吗?,python,python-3.x,list,variable-assignment,Python,Python 3.x,List,Variable Assignment,我创建了一个函数f,它使用一个二维列表作为参数,但是在这个函数之后,列表一点也没有改变。 代码如下: def f(t: [[int]]): for eachrow in t: eachrow = eachrow[1:] eachrow.append(0) A = [[2, 10, 0], [3, 1, 2], [3, 2, 1]] f(A) print(A) # -> [[2, 10, 0], [3, 1, 2], [3, 2, 1]] 如
def f(t: [[int]]):
for eachrow in t:
eachrow = eachrow[1:]
eachrow.append(0)
A = [[2, 10, 0], [3, 1, 2], [3, 2, 1]]
f(A)
print(A) # -> [[2, 10, 0], [3, 1, 2], [3, 2, 1]]
如果打印出对
eachrow
所做更改的结果,您将看到您正在更新eachrow
变量,但这不会影响原始t
变量
def f(t):
for eachrow in t:
eachrow = eachrow[1:]
eachrow.append(0)
print(eachrow)
如果要影响阵列本身,应修改阵列,如下所示:
def f(t):
for row_number in range(len(t)):
t[row_number] = t[row_number][1:]
t[row_number].append(0)
在
eachrow=eachrow[1://code>中指定给eachrow
将覆盖它。因此,要删除第一个元素,可以使用del
或row.pop
或
您只更新循环变量,而不是输入parameter@cricket_007eachrow
最初是t
中的一个项目,但切片会覆盖它。我发布了一个关于这个的答案。顺便说一句,欢迎来到Stack Overflow ClassicalPi!检查.Note,这不是正确的类型注释:t:[[int]]
应该是t:typing.List[typing.List[int]]
问题不在于迭代t
,而在于切片。我发布了一个关于这个的答案。顺便说一句,列表是一个iterable,而不是迭代器,因为它不会被耗尽;我认为Python没有指针——Python名称更像是引用IIRC。但是索引t
是解决这个问题的一个非常好的方法。“该数组元素上的迭代器是该列表元素的副本”,绝对不正确。它们不是复制品。将任何可变变量放入一个列表中,例如,另一个列表:data=[[],[]]
然后对数据中的x执行操作:x.append(0)
然后打印data
,您将看到外部列表中的列表都已修改。注意!答案中已修复。感谢@wjandrea和juanpa两位抓住了这个问题。@j6m8哎呀,实际上我错了,这不是切片,而是作业。wmorrel纠正了我的错误,我更新了我的答案。从技术上讲,这不是切片在复制,而是赋值发生在局部变量上。如果循环体改为eachrow=0
@wmorrell,则会得到相同的结果您是对的!但是为什么分配给切片会起作用呢?这是因为它分配给列表的“内部”而不是名称吗?@wjandrea这是片分配符号:行[:]=行[1:]
,它与“分配给片”不同,也就是说,它不创建片(这只是一个新列表)并分配给那个新的片,而是简单地修改为original@wmorrell说清楚了,,右侧的每一行[1://code>确实创建了一个切片,即一个全新的列表
对象说一个全新的列表
对象有点误导。切片创建一个新的切片
,该切片引用原始的列表
项。项目本身不会被复制,这是大多数人在说“新建list
object”时所期望的。换句话说,a=row[:]
不同于a=list(row)
。
def f(t):
for row_number in range(len(t)):
t[row_number] = t[row_number][1:]
t[row_number].append(0)
def f(t):
for row in t:
del row[0] # OR row.pop(0) OR row[:] = row[1:]
row.append(0)
A = [[2, 10, 0], [3, 1, 2], [3, 2, 1]]
f(A)
print(A) # -> [[10, 0, 0], [1, 2, 0], [2, 1, 0]]