必须知道的python和C的10个区别

本文探讨了Python作为动态语言与C语言作为静态语言在变量类型决定、内存管理、传值方式以及Python的鸭子类型等方面的异同,强调了Python中引用的概念和对象的可变性与不可变性特征。

python和C语言的一些异同

  1. python为动态语言,c为静态语言。
    c语言在编译的时候就决定了变量存储的类型和位置,而python运行时才决定。
  2. 变量的创建
    这个是我最开始没有理清的,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标识符。

  1. 内存管理
    在c语言中一般需要malloc和free去手动管理分配内存,内存管理交给了程序员去实现。在python中则使用引用计数去做。
  2. 变量类型
    与c语言不同,python在定义时不需要指明变量类型的。这可能也与第二条有关,因为python的标识符只是指向一个生成的对象,而不是对象本身。
var1 = 123
var1 = '1324'
  1. 函数传值
    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的数字,字符串,元组是不可变对象,如果修改则会重新创建一个,绑定在变量标签上)。

  1. 鸭子类型(未完待续)
### Python、C语言Java的主要区别 #### 性能差异 Python由于存在全局解释器锁(Global Interpreter Lock, GIL),在多线程环境下表现不佳,这使得它的运行速度相对较慢[^2]。相比之下,C语言是一种低级编程语言,能够直接操作硬件资源,因此具有更高的执行效率更快的速度。Java则介于两者之间,在性能上不如C语言高效,但由于JVM的存在,它能够在多种平台上实现“一次编写,到处运行”的特性。 #### 编程范式支持功能 PythonJava都支持面向对象编程(OOP),并且提供了丰富的标准库来简化开发过程[^3]。然而,C语言主要是一个过程式的程序设计语言,并不内置OOP的支持机制[^4]。这意味着开发者如果想采用OOP风格的话,则需通过结构体模拟类的概念并手动管理成员函数等复杂逻辑. #### 内存管理安全性 C语言允许程序员直接访问内存地址并通过指针进行修改, 这种灵活性虽然强大但也容易引发安全漏洞或者难以调试的错误(如缓冲区溢出)[^4]. 反观之, Java完全屏蔽掉了显式指针概念从而提高了应用层面的安全保障; 同样地, Python也采取自动垃圾回收策略处理不再使用的变量/对象释放工作, 减少了因不当分配而导致崩溃的风险. #### 跨平台能力 得益于虚拟机技术(JVM), Java应用程序只需编译成字节码形式即可无缝移植到任何安装有所对应版本 JVM 的设备上去运行而不必重新构建源代码本身. 对应地讲,Pthon解释型的本质决定了只要目标机器上有相应解释环境就可立即加载脚本文件予以解析执行无需额外步骤转换为目标二进制格式. 不过对于严格意义上的嵌入式系统而言可能还是更倾向于选择轻量级且控制粒度更大的解决方案比如纯手工打造基于裸机驱动下的 C 应用框架[^1]. ```python # 示例展示简单的 Hello World 实现方式对比: # Python 版本 print("Hello, world!") # Java 版本 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } } // C 语言版本 #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值