我正在编写一个代码,变量开始表现得很奇怪并被分配给我认为不应该的东西。因此,为了解决我的疑虑,我决定将情况降低到最低限度,这就是发生的事情:
以下代码:
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的副本。我不认为这是真的,因为这里也与函数内的过程的局部性特征相违背。
答案 0 :(得分:2)
Python变量是对象的引用,有些对象是可变的。数字不是,字符串也不是元组,但是列表,集合和字母都是。
让我们看看以下Python代码
forEach
答案 1 :(得分:1)
在第一个示例中,您只需将c
(a
)的引用传递给d
。
所以,无论你对d
所做的一切都会发生在a
上。
在第二个示例中,您复制c
(a
)的值并将其提供给新变量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
列表,然后更改该列表中的第一个值。 d
,a
和c
都引用相同的列表。
在版本2中,您使用的是d
,对于Python来说,意味着“获取名为list(c)
的可迭代事物的内容,并从中创建一个名为{{1}的新的不同列表}}”。现在,您的列表中有两个副本。一个称为c
或d
,另一个称为a
。因此,当您更新c
时,您正在操作列表的第二个副本。 d
保持不变。
答案 5 :(得分:0)
&#39; d = C&#39;指前面所述的参考副本。这意味着,现在d将引用与c相同的对象。当您对引用的对象进行直接操作时,a引用的对象的值也会更改。
当你这样做时,d = list(c)&#39;这意味着创建了一个新的列表对象,其中包含了c。但是,d不再引用相同的对象。因此,函数内的变化不会影响a。