Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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_Variable Assignment - Fatal编程技术网

为什么此参数列表没有';Python中没有变化吗?

为什么此参数列表没有';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]] 如

我创建了一个函数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]]

如果打印出对
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_007
eachrow
最初是
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]]