python和C语言的一些异同
- python为动态语言,c为静态语言。
c语言在编译的时候就决定了变量存储的类型和位置,而python运行时才决定。 - 变量的创建
这个是我最开始没有理清的,c语言创建时会为每个变量分配空间,然后通过标识符去访问变量。而python则为引用。
比如a=123,表示创建一个为123的数字型变量,然后将对象地址给a。也就是为123贴上a的标签,为了节省空间,两个对象可以通过而在c语言中,则是在内存中创建123的值,我们可以通过标识符去访问这个值和它的地址。
a = 1
b = 1
id(a)==id(b)
>>> true
上面的代码为什么会出现这样的结果呢?因为,变量a和b都指向了创建的对象1。有人可能就会有疑问,那如果将a修改为2时,那岂不是b也变了。如果按照c语言指针去理解确实是这样,但是在python中右边的值才是创建的对象,左边的始终是标签。
在将a赋值为2时,a会取消对对象1的引用,系统会创建一个对象2,将a标识符指向为2。所以并不影响b标识符。
- 内存管理
在c语言中一般需要malloc和free去手动管理分配内存,内存管理交给了程序员去实现。在python中则使用引用计数去做。 - 变量类型
与c语言不同,python在定义时不需要指明变量类型的。这可能也与第二条有关,因为python的标识符只是指向一个生成的对象,而不是对象本身。
var1 = 123
var1 = '1324'
- 函数传值
python的传值方式是引用传值。那可能就有人要反驳我了,比如下面这个场景:
a = 1
def test(my_var):
my_var=123
print(a)
>>> 1
如果是引用传值为什么结果仍然是1呢?
是这样的,在函数中my_var与a都指向整形对象1,但是在重新给my_var赋值时,my_var指向了新创建的对象123,所以后面print(a)的值仍然为1,因为它仍然指向整形变量1.
在Python中,传参是传递对象引用的值。这意味着在函数中对传递的对象进行修改时,原始对象也会被改变。但是,如果在函数内部重新分配变量,原始对象不会受到影响(因为,python的数字,字符串,元组是不可变对象,如果修改则会重新创建一个,绑定在变量标签上)。
- 鸭子类型(未完待续)
本文探讨了Python作为动态语言与C语言作为静态语言在变量类型决定、内存管理、传值方式以及Python的鸭子类型等方面的异同,强调了Python中引用的概念和对象的可变性与不可变性特征。
2698

被折叠的 条评论
为什么被折叠?



