Skip to main content
 首页 » 编程设计

python数据结构,操作列表的不同和最常用的方法是什么

2025年05月04日19zhujiabin

我对在 python 中使用方法来操作列表感到很困惑。说你有

mylist = [1,2,3,4] 
mylist.append(5) #works fine,  

但是当我把

def adding(mylist): 
    mylist.append(5) 
 
print adding(mylist) #will print out the orginal list without the 5. 

此外,

data2 = data3 = [1,2,3] 
data2 = data2 +[4]+[5]+[6] # doesn't works 
data3 += [4] +[5] +[6] #works 

但我对它们的工作方式感到很困惑。

所以我想制作一个列表(不是在 python 方面)以不同的方式来操作列表。谁能帮忙?

请您参考如下方法:

我怀疑您期望原始代码能够工作的原因是因为您 更熟悉 C++ 等语言中的引用传递。这很重要 然后要注意按引用传递和按值传递的区别。 了解使用的是哪一种 Python 更为重要。

简而言之,Python 实际上既不使用引用传递 也不使用值传递; 传递是通过 Python 中的 object 完成的。


长答案:

按值传递的例子可以用 C:

#include <stdio.h> 
 
void adding(int i) { 
    i = i + 1; 
} 
 
int main() { 
    int i = 0; 
    adding(i); 
    printf("i is %d\n", i);  // will print "i is 0" 
    return 0; 
} 

此处,当传递给 adding() 时,i 的值被复制。 int i 里面 adding(int i) 驻留在与原始 int 不同的内存位置 我 在 main() 中。所以在 adding() 中,i = i + 1 只影响中的值 仅在 adding() 范围内已知的内存块,i 在 main() 完全不受影响,因为它驻留在不同的 block 中 内存。

通过引用传递的例子可以用 C++ 实现:

#include <iostream> 
 
void adding(int &i) { 
    i = i + 1; 
} 
 
int main() { 
    int i = 0; 
    adding(i); 
    std::cout << "i is " << i << std::endl;  // will print "i is 1" 
    return 0; 
} 

这里 i 通过引用传递给 adding()。 adding() 中的i 是指 到与 main() 中的 i 完全相同的内存块。因此,i 将 递增到 1。


现在,让我们回到您的示例(我修改过的示例)来讨论 Python 通过猜测你的实际意思 =]):

# Case 1 
mylist = [1,2,3,4] 
mylist.append(5)  # will print [1,2,3,4,5] 
 
# Case 2 
mylist = [1,2,3,4] 
def adding(mylist): 
    mylist.append(5) 
 
adding(mylist) 
print mylist  # will print [1,2,3,4,5] 
 
# Case 3 
mylist = [1,2,3,4] 
def adding(mylist): 
    mylist = mylist + [5] 
 
adding(mylist) 
print mylist  # will print [1,2,3,4] 
 
# Case 4 
mylist = [1,2,3,4] 
def adding(mylist): 
    mylist += [5] 
 
adding(mylist) 
print mylist  # will print [1,2,3,4,5] 

这里,mylist 既不是按值传递也不是按引用传递。它实际上是通过 对象。

在 Python 中,mylist = [1,2,3,4] 创建一个列表 [1,2,3,4] 并附加一个 tag mylist 到它。这里要注意的重要一点是 list 是一个 对象(IIRC,每个对象都是 PyObject 或其扩展)。

了解这种区别将使您能够理解 示例案例:

  1. 在情况1中,.append()直接在[1,2,3,4]列表对象上调用到 更改列表值,因此对象 myobject 附加到具有 变了。请注意,这也是可能的,因为列表是可变对象 python 。

  2. 在情况 2 中,mylist 在传递给 adding() 时没有被复制,它仍然是 “附加”到同一个列表对象,类似于案例 1。因此,调用 此对象上的 .append()将更改对象本身。在外面 adding(),因为 mylist 仍然附加到同一个对象(即使 对象已改变自身),我们得到输出 [1,2,3,4,5]。

  3. 在情况 3 中,在 adding() 中,局部变量 mylist 附加到 [1,2,3,4]+[4] 创建的新对象。但是对象是原来的mylist 指向从未改变过,因此,输出仍然是 [1,2,3,4]。

  4. 案例 4 有点棘手。在 Python 中列表是可变的,+= 行为 作为像 .extend() 这样的快捷方式,它作用于调用对象本身。因此, 原始对象已修改为 [1,2,3,4,5] 和 mylist 仍然 附加到它。也许还值得注意的是,对于像这样的不可变对象(immutable对象) 元组、字符串和数字,+= 将创建一个新 对象并附加 变量。


至于在 Python 中使用列表的不同方式,这 article written by Fredrik Lundh包含非常详尽的信息。