python 函数的参数传递:

对象的类型可以分为两类:不可变类型和可变类型。

  • 不可变类型,如整数、字符串、元组:类似 c++ 的值传递,实际上就是将实际参数值的副本(复制品)传入函数,而参数本身不会受到任何影响。即传递的只是变量a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
  • 可变类型,如列表,字典:类似 c++ 的引用传递。定义一个可变变量a相当于创建了一个可变对象,并定义了一个引用变量(其实就是一个指针)a指向该对象,这意味着此时内存中有两个东西:对象本身和指向该对象的引用变量。参数传进函数后,修改后函数外部的原变量a也会受影响。这里其实依然采用值传递方式:把可变变量a的值赋给函数fun(b)的形参b,它传进去的是对象的地址值。
  • 因此在 Python 函数中,如果需要让函数修改某些数据,可以通过把这些数据包装成列表、字典等可变对象,然后把列表、字典等可变对象作为参数传入函数,在函数中通过列表、字典的方法修改它们,这样才能改变这些数据。

python对象的赋值:

id()函数:

Python 中的所有对象都有其自己的唯一 id,id 是对象的内存地址,id 在创建时已分配给对象,并且在每次运行程序时都不同。(除了某些具有恒定唯一 id 的对象,比如 -5 到 256 之间的整数)

# 不可变类型
a = 5000
print(id(a))
b = 5000
print(id(b))
#2435819685936
#2435819685936
a = 5000
print(id(a))
print(id(5000))
#2698075883568
#2698075883568

a = 1
print(id(a))
a = 10
print(id(a))
#140709837906320
#140709837906608

a = 5000
print(id(a))
a = 5001
print(id(a))
#2988648548400
#2988648547536

# 可变类型
a = [1,2,3,4]
print(id(a))
a = [1,2,3,4]
print(id(a))
#2370400833928
#2370400834440

a = [1,2,3,4]
print(id(a))
print(id(a))
#2170928124296
#2170928124296

a = [1,2,3,4]
print(id(a))
a[2] = 5
print(id(a))
#1890860093832
#1890860093832

在 python 中,变量没有类型,对象才有类型(例如:a=5, 那么5就是对象,int型;a是变量,没有类型,是一个对象的引用)。

  • 不可变类型:变量赋值 a=1 后再赋值 a=10,这里实际是新生成一个 int 值对象10让 a 指向它,而 1被丢弃,不是改变a的值,相当于新生成了a。   而与C++不同,赋值a=5000后再赋值b=5000,二者的id是一样的。
  • 可变类型:
  • 变量赋值 a=[1,2,3,4] 后再赋值 a[2]=5 则是将a的第三个元素值更改,本身a没有动,只是其内部的一部分值被修改了。
  • 而相反的,连续赋值两次a = [1,2,3,4]的情况,二者id不同。