我有一个关于Python处理内存以复制变量的问题。
例如,我有一个列表(或字符串,元组,字典,集)变量
A = [1,2,3]
然后我将A的值赋给另一个变量B
B = A
然后,如果我做"一些变化"到A,例如,
A.pop(0)
然后B也会改变,即
print(A,B)会给我([2,3],[2,3])
我读了一些材料,他们说" B = A没有将A的值复制到B标记的内存中的新位置。它只是使名称B指向内存中与A相同的位置。 "我可以解释这个,因为我们仍然只有一个记忆位置,但现在它有两个名字?
但是,我发现如果我对A做了一些其他更改,例如
A = [5,6] # I reassign A value,
然后我找到了 打印(A,B) 给了我([5,6],[1,2,3])
所以我在这里很困惑。现在看来我们有两个记忆位置
答案 0 :(得分:3)
你的第一个理解是正确的。当你这样做
B = A
现在你有两个名字指向内存中的同一个对象。
你的误解就是你做的事情
A = [5, 6]
这不会将[5, 6]
复制到内存中的该位置。它会分配一个新列表[5, 6]
,然后将名称A
更改为指向此列表。但是B
仍然指向它之前指向的相同列表。
基本上,每次你做
A = <something>
你正在改变A
点的位置,而不是改变它所指向的东西。
答案 1 :(得分:0)
列表是对象,因此按引用调用&#39;。当你写B=A
时,你会在A后面的对象(不是A本身!)上得到一个引用(c指针),所以基本上,正如你的代码告诉你的那样,A is B == True
。引用不在A上,而是在A指向的对象上,因此如果您将A更改为A = [5,6]
,解释程序将注意到您在旧列表上有另一个引用(B)并将保留引用和列表(否则它将落在垃圾收集器中)。它只会更改存储在A中的地址。
然而,如果您重新B=A
,则B将[5,6]
。
答案 2 :(得分:0)
你第二次将新的obj分配给a
stderr
答案 3 :(得分:0)
列表,元组和对象在Python中 引用 。您可以将这些变量名称视为C中的指针。因此,A是某个位置的指针,存储数组,当您复制 引用 <!-- Feature Row -->
<div class="row">
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "some";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM information order by Ranking desc LIMIT 3 ";
$result = $conn->query($sql);
if ($result->num_rows > 0):
// output data of each row
while ($row = $result->fetch_assoc()):
?>
</article>
<article class="col-md-4 article-intro">
<a href="#">
<img class="img-responsive img-rounded" src=" <?php echo $row['imgagePath']; ?>" alt="">
</a>
<h3>
<a href="#"> <?php echo $row['username']; ?></a>
</h3>
</article>
<?php endwhile; ?>
</div>
...
<?php endif; ?>
时 到该位置(地址)到B。
因此,当您更改该位置的内容时,通过A 更改,然后,无论您是通过A还是B访问,该答案都将是该内存位置的内容。
但是,如果您想复制元素,可以使用
B = A
或类似的东西。
当您为A B = [i for i in A]
分配了一些其他值时,A处的引用现在指向某些其他内存位置,而B处的引用指向原始位置,因此B保持不变。