为他们分配的变量和内存?

时间:2016-06-04 14:50:26

标签: python memory

我有一个关于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])

所以我在这里很困惑。现在看来我们有两个记忆位置

4 个答案:

答案 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保持不变。