一、Python的函数传递二、python类方法外部传参

一、Python的函数传递

a = 1
 def fun(a):
 print(“函数里”,id(a))
 a = 2
 print(“赋值后”,id(a), id(2))
 print(“函数外”,id(a), id(1))
 fun(a)
 print(a)


函数外 1954180160 1954180160

函数里 1954180160

赋值后 1954180192 1954180192

1

可以看到,在执行完a = 2之后,a引用中保存的值,即内存地址发生变化,由原来1对象的所在的地址变成了2这个实体对象的内存地址。下面我们来看另一个例子:

a = []
def fun(a):
print(“函数里”,id(a))
a.append(1)
print(“函数外”,id(a))
fun(a)
print(a)
函数外 2066745607752

函数里 2066745607752

[1]

注意:

类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。

strings, tuples, 和numbers是不可更改的对象,而 list, dict, set 等则是可修改的对象。

当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象number,当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象list,指向了列表的内存地址,因此调用并不会改变list内存地址.

二、python类方法外部传参

class MyClass:
 “”“help myclass”""
 x=123
 def foo(self):
 print(self.x)a = MyClass()
 print(a.foo())‘’’
 123
 None
 ‘’’


注:

MyClass()实际上调用的是init(self)方法,可以不定义,如果没有定义会在实例后隐式调用。

作用:对实例进行初始化。

init()方法不能有返回值,也就是只能是None.

class Employee:
‘所有员工的基类’
empCount = 0

def __init__(self, name, salary):
    self.name = name
    self.salary = salary
    Employee.empCount += 1

def displayCount(self):
    print("Total Employee %d" % Employee.empCount)

def displayEmployee(self):
    print("Name : ", self.name, ", Salary: ", self.salary)

employee = Employee(‘xiaomaili’,‘666’) #创建实例对象

访问属性:可以使用点号 . 来访问对象的属性。使用如下类的名称访问类变量:

employee.displayCount() # 访问对象的属性,返回Total Employee 1
employee.displayEmployee() # 访问对象的属性,返回Name : xiaomaili , Salary: 666

添加,删除,修改类的属性

employee.age = 7 # 添加一个 ‘age’ 属性
employee.age = 8 # 修改 ‘age’ 属性
employee emp1.age # 删除 ‘age’ 属性

‘’’
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
‘’’