为什么python在定义函数时会对这样的列表进行处理?

时间:2018-05-31 21:39:23

标签: python python-3.x list variables

我正在编写一个代码,变量开始表现得很奇怪并被分配给我认为不应该的东西。因此,为了解决我的疑虑,我决定将情况降低到最低限度,这就是发生的事情:

以下代码:

a = [2]

def changeA(c):
    d = c
    d[0] = 10
    return True

changeA(a)

print(a)

打印'[10]'。这对我来说没有意义,因为在第一次任务之后我从未将列表“a”指定为任何内容。在函数changeA中,局部变量d被指定为函数的输入,在我看来,这个赋值是双向发生的,甚至改变了“外部”。如果是这样,为什么?如果没有,为什么会发生这种情况?

我也注意到了代码

a = [2]

def changeA(c):
    d = list(c)
    d[0] = 10
    return True

changeA(a)

print(a)

表现正常(即,正如我所料)。

编辑:此问题被视为this one的副本。我不认为这是真的,因为这里也与函数内的过程的局部性特征相违背。

6 个答案:

答案 0 :(得分:2)

Python变量是对象的引用,有些对象是可变的。数字不是,字符串也不是元组,但是列表,集合和字母都是。

让我们看看以下Python代码

forEach

答案 1 :(得分:1)

在第一个示例中,您只需将ca)的引用传递给d

所以,无论你对d所做的一切都会发生在a上。

在第二个示例中,您复制ca)的值并将其提供给新变量d

因此,d现在具有与c(即a)相同的值但不同的参考值。

注意:您可以使用id()函数查看变量的引用或ID。

a = [2]
print id(a)

def changeA(c):
    d = c
    pirnt id(d)
    d[0] = 10
    return True

changeA(a)

print(a)


a = [2]
print id(a)
def changeA(c):
    d = list(c)
    print id(d)
    d[0] = 10
    return True

changeA(a)

print(a)

答案 2 :(得分:1)

因为当你这样做时:

 d = list(c)

创建一个新对象。但是当你做的时候

d = c

您正在引用该对象。

如果你做了

d.append(5)

到第一个例子,你会得到

[10,5]

与第二个操作相同,列表未被修改。

以下链接中的更深入解释:http://henry.precheur.org/python/copy_list

答案 3 :(得分:0)

在Python中,名称引用值,因此您有2个名称指向相同的值。

答案 4 :(得分:0)

在版本1中,您创建了一个列表 import React, { Component } from 'react'; class Products extends Component { state = { todos: [] }; async componentDidMount() { try { const res = await fetch('http://127.0.0.1:8000/api/'); const todos = await res.json(); this.setState({ todos }); } catch (e) { console.log(e); } } render() { return ( <div> {this.state.todos.map(item => ( <table class="table table-bordered table-hover table-striped"> <thead> <tr class="bg-gray text-white"> <th>Id</th> <th>Category</th> <th>Name</th> <th>Short Description</th> <th>Price</th> <th class="text-center">Image</th> <th>Delete</th> </tr> </thead> <tbody> <tr> <td scope="row">{item.title}</td>, <td scope="row"></td>, <td></td> <td></td> <td></td> <td></td> <td>Delete</td> </tr> </tbody> </table> ))} </div> ); } } export default Products; ,将其传递给假名a下的函数,创建另一个假名c列表,然后更改该列表中的第一个值。 dac都引用相同的列表。

在版本2中,您使用的是d,对于Python来说,意味着“获取名为list(c)的可迭代事物的内容,并从中创建一个名为{{1}的新的不同列表}}”。现在,您的列表中有两个副本。一个称为cd,另一个称为a。因此,当您更新c时,您正在操作列表的第二个副本。 d保持不变。

答案 5 :(得分:0)

&#39; d = C&#39;指前面所述的参考副本。这意味着,现在d将引用与c相同的对象。当您对引用的对象进行直接操作时,a引用的对象的值也会更改。

当你这样做时,d = list(c)&#39;这意味着创建了一个新的列表对象,其中包含了c。但是,d不再引用相同的对象。因此,函数内的变化不会影响a。