函式參數為物件

將物件傳入函式,可以修改物件的成員變數。

在0x1000記憶體位址,建立Person物件,p1變數指到0x1000。
img

1.在Stack建立change()函式空間。
2.參數傳來的p1記憶體位址0x1000,複製給person區域變數。
img

person的記憶體位址是0x1000,修改0x1000記憶體位址的name與age 屬性。
img

離開change函式,change函式空間的person區域變數,記憶體位址被釋放。
img

完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person:
    name = None
    age = None
    def __init__(self, name, age):
        self.name = name
        self.age = age

def change(person):
    person.name = "Mary"
    person.age = 10

p1 = Person("Bill", 20)
print(f"p1 name = {p1.name}, age = {p1.age}")
change(p1)
print(f"p1 name = {p1.name}, age = {p1.age}")
p1 name = Bill, age = 20
p1 name = Mary, age = 10

函式參數指向None

將物件傳入函式,並把它的記憶體位址變成None,不會影嚮外部的物件。

在0x1000記憶體位址,建立Person物件,p1變數指到0x1000。
img

1.在Stack建立change()函式空間。
2.參數傳來的p1記憶體位址0x1000,複製給person區域變數。
img

將person區域變數指派為None。
img

離開change函式,change函式空間的person區域變數,記憶體位址被釋放。
img

由以下執行結果可以發現,p1指向的物件沒有變成None。

完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person:
    name = None
    age = None

    def __init__(self, name, age):
        self.name = name
        self.age = age


def change(person):
    # person 指向 None
    person = None

p1 = Person("Bill", 20)
print(f"p1 name = {p1.name}, age = {p1.age}")
change(p1)
print(f"p1 name = {p1.name}, age = {p1.age}")
p1 name = Bill, age = 20
p1 name = Bill, age = 20

results matching ""

    No results matching ""