在for循环中使用unpack和在python中不使用unpack有什么区别

2024-05-17 14:00:03 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能解释为什么在test1中,nums是[[0,0],-1,-1],[0,0],[0,0]],而不是test2吗?据我所知,xxx中的python for xx非常类似于任何其他语言中的for循环,并采用元素对元素的方式。那么在for循环中使用unpack和not有什么不同呢?谢谢

test([[0,0],[0,0],[0,0],[0,0]])
test2([[0,0],[0,0],[0,0],[0,0]])
def test1(self, nums):
    ctn = 0
    for e in nums:
        ctn += 1
        u, v = e
        if ctn == 2:
            e[0] = e[1] = -1
    print(nums)  #[[0,0],[-1,-1],[0,0],[0,0]]

def test2(self, nums):
    ctn = 0
    for u, v in nums:
        ctn += 1
        if ctn == 2:
            u = v = -1
    print(nums)  #[[0,0],[0,0],[0,0],[0,0]]

Tags: inself语言元素forifdef方式
3条回答

在第一个函数u中,v=e不做任何事情,删除它我得到相同的答案

def test1(nums):
    ctn = 0
    k = []
    for e in nums:
        ctn += 1
        if ctn == 2:
            e[0] = e[1] = -1
    print(nums)

def test2(nums):
    ctn = 0
    for u, v in nums:
        ctn += 1
        if ctn == 2:
            u = v = -1
    print(nums)

变量uv引用子列表中的元素,而不引用子列表本身。当您更改任一值时,都不会引起任何副作用。你知道吗

但是,e是对子列表本身的引用。当您索引到e并更改其值时,您正在子列表本身中执行赋值,因此会产生副作用(更改原始列表中的值)。你知道吗

Python中的变量保持引用。这意味着,当您将一个可变对象(列表)分配给一个变量并通过该变量更改对象时,您将更改原始对象。这就是test1确实更改原始列表的原因。你知道吗

但是,当您赋值给一个变量时,您不会更改它以前引用的对象,而是将它指向一个新对象。当您赋值给uv中的test2时,您不会更改原始对象中的任何内容。你知道吗


当您使用e[0] = -1时,您不会赋值给变量e,而是实际修改e所指向的对象

相关问题 更多 >