1 Python 和 Java 在类属性(静态属性)和实例属性的处理

题目

执行以下程序,输出结果为()
class Base(object):count = 0def __init__(self):pass
b1 = Base()
b2 = Base()
b1.count = b1.count + 1
print(b1.count,end=" ")
print(Base.count,end=" ")
print(b2.count)A 1 1 1
B 1 0 0
C 1 0 1
D 抛出异常正确答案:B

解析

在这个程序中,我们需要理解类属性和实例属性的区别:

  1. count = 0 是 Base 类的类属性,所有实例共享这个属性
  2. 当我们创建 b1 = Base() 和 b2 = Base() 时,它们最初都没有自己的 count 实例属性,会共享类的 count 属性

关键操作是 b1.count = b1.count + 1

  • 这行代码首先读取 b1.count,由于 b1 没有自己的 count 属性,会读取类属性 Base.count(值为 0)
  • 然后创建一个 b1 的实例属性 count,并赋值为 0 + 1 = 1

此时:

  • b1.count 访问的是 b1 自己的实例属性,值为 1
  • Base.count 访问的是类属性,仍然保持初始值 0
  • b2.count 访问的是类属性(因为 b2 没有自己的实例属性),值为 0

所以输出结果是 1 0 0,正确答案是 B。

【base不用先创造实例吗?】

在 Python 中,类属性(如 Base.count)属于类本身不需要先创建实例就可以直接访问。

类属性的特点:

  • 它是类级别的属性,不属于任何特定实例
  • 可以通过 类名.属性名 直接访问(如 Base.count
  • 所有实例在没有自己的同名实例属性时,都会共享这个类属性

在你提供的代码中:

  • count = 0 是 Base 类的类属性,定义后就存在了
  • 即使不创建 b1 和 b2 实例,也可以直接访问 Base.count(值为 0)

当创建实例后:

  • b1 和 b2 初始时没有自己的 count 属性,所以 b1.count 和 b2.count 会指向类属性 Base.count
  • 直到执行 b1.count = ... 时,才会给 b1 创建一个独立的实例属性 count,此时 b1.count 不再指向类属性

这就是为什么代码中可以直接访问 Base.count 而不需要先创建实例的原因。

【这个py和java的语法规则一样吗?】

不仅学混了还学忘了。

Python 和 Java 在类属性(静态属性)和实例属性的处理上有相似之处,但语法和细节实现细节存在差异,主要区别如下:

1. 类属性的定义与访问

  • Python
    直接在类中定义的变量就是类属性,无需特殊关键字,可通过 类名.属性名 或 实例.属性名(无同名实例属性时)访问。
    例:

    python

    运行

    class Base:count = 0  # 类属性print(Base.count)  # 直接通过类访问,无需实例化
    
  • Java
    类属性需要用 static 关键字声明,称为 “静态属性”,必须通过 类名.属性名 或 实例.属性名 访问(推荐用类名)。
    例:

    java

    运行

    class Base {static int count = 0;  // 静态属性(类属性)
    }public class Main {public static void main(String[] args) {System.out.println(Base.count);  // 直接通过类访问}
    }
    

2. 实例属性对类属性的遮蔽(Shadowing)

  • Python
    当实例定义与类属性同名的实例属性时,会自动 “遮蔽” 类属性(实例访问时优先用自己的属性,类访问仍用类属性)。
    例:

    python

    运行

    b1 = Base()
    b1.count = 1  # 给b1创建实例属性,遮蔽类属性
    print(b1.count)  # 1(实例属性)
    print(Base.count)  # 0(类属性不受影响)
    
  • Java
    实例不能定义与静态属性同名的实例属性(编译报错),避免混淆。
    若尝试定义:

    java

    运行

    class Base {static int count = 0;int count;  // 编译错误:与静态属性重名
    }
    

3. 核心区别总结

场景PythonJava
类属性声明直接定义(无关键字)必须用 static 关键字
类属性访问类名。属性 或 实例。属性(无同名实例属性)类名。属性 或 实例。属性(推荐类名访问)
实例与类属性重名允许(实例属性遮蔽类属性)不允许(编译报错)
类属性是否依赖实例化不依赖(类加载时就存在)不依赖(类加载时就存在)

回到原题

如果用 Java 实现类似逻辑,由于不允许实例属性与静态属性重名,b1.count = ... 这样的代码会直接编译报错。

但 Python 允许这种操作,因此两者行为不同。

简单说:语法规则不完全相同,核心差异体现在类属性的声明方式和实例属性与类属性的重名处理上

2 Python中or运算符的一个重要特性:它返回的是操作数本身,而不是布尔值。

Python 中的 or 运算符有一个重要特性:它返回的是第一个为 “真” 的操作数,而不是单纯的布尔值 True 或 False。如果所有操作数都为 “假”,则返回最后一个操作数。

这与许多其他编程语言中 or 仅返回布尔值的行为不同,在 Python 中,or 更像是 "返回第一个真值" 的运算符。

示例:

python

运行

# 返回第一个真值(非空字符串是真值)
print("hello" or 0)  # 输出: hello# 0是假值,返回第二个操作数
print(0 or "world")  # 输出: world# 所有都是假值,返回最后一个
print(0 or "" or None)  # 输出: None# 数字0是假值,非0数字是真值
print(0 or 42)  # 输出: 42# 空列表是假值,非空列表是真值
print([] or [1, 2, 3])  # 输出: [1, 2, 3]

这个特性在 Python 中非常实用,可以用来简洁地设置默认值,例如:

python

运行

def greet(name=None):# 如果name为None(假值),则使用"Guest"作为默认值name = name or "Guest"print(f"Hello, {name}!")greet()  # 输出: Hello, Guest!
greet("Alice")  # 输出: Hello, Alice!

理解这个特性有助于写出更简洁、更 Pythonic 的代码。

【和java一样吗?不一样!】

在 Java 中,|| 运算符(逻辑或)的行为与 Python 的 or 有本质区别:

Java 的 || 严格返回布尔值(true 或 false),不会返回操作数本身。它仅判断操作数的真假性,最终结果只能是布尔类型。

示例对比:

java

运行

// Java 中 || 返回布尔值
System.out.println("hello" || 0);  // 编译错误(操作数类型不兼容)
System.out.println(0 || 42);      // 编译错误(操作数必须是布尔类型)// 正确用法:操作数为布尔值,结果为布尔值
System.out.println(1 > 0 || 2 > 5);  // 输出 true
System.out.println(1 < 0 || 2 > 5);  // 输出 false

而 Python 的 or 如前所述,返回的是第一个为 "真" 的操作数本身(非布尔值),这是两种语言在设计上的明显差异。

简单说:

  • Java 的 || 是 "逻辑或判断",结果只能是 true/false
  • Python 的 or 是 "取第一个真值",结果是操作数本身

题目

下列Python3代码运行结果是( )
a = 'a'
print(a > 'b' or 'c')
A a
B b
C c
D True
E False正确答案:C

这道题考查的是 Python 中 or 运算符的特性 —— 它返回的是操作数本身,而不是布尔值,这与许多其他语言不同。

分析代码 print(a > 'b' or 'c')

  1. 首先计算 a > 'b',其中 a = 'a'。在 Python 中,字符串比较是基于字符的 Unicode 编码值,'a' 的编码值小于 'b',所以 a > 'b' 的结果为 False(假值)。
  2. 然后执行 or 运算。or 运算符的逻辑是:如果第一个操作数是真值,则返回第一个操作数;如果第一个操作数是假值,则返回第二个操作数。
  3. 由于 a > 'b' 的结果是 False(假值),所以 or 运算返回第二个操作数 'c'

因此,代码的输出结果是 c,正确答案是 C。

3 Python 中可以直接修改原字典的方法

  1. 直接赋值
    通过 dict[key] = value 为已有键设置新值,或添加新的键值对:

    python

    运行

    d = {"a": 1}
    d["a"] = 100  # 修改已有键
    d["b"] = 2    # 添加新键值对
    
  2. update()
    合并其他字典或键值对到原字典,重复键会被覆盖:

    python

    运行

    d = {"a": 1}
    d.update({"b": 2, "a": 10})  # 原字典变为 {"a": 10, "b": 2}
    
  3. pop(key[, default])
    删除指定键并返回其值,原字典尺寸减小:

    python

    运行

    d = {"a": 1, "b": 2}
    d.pop("a")  # 返回 1,原字典变为 {"b": 2}
    
  4. popitem()
    删除并返回字典中最后插入的键值对(Python 3.7+ 有序):

    python

    运行

    d = {"a": 1, "b": 2}
    d.popitem()  # 返回 ("b", 2),原字典变为 {"a": 1}
    
  5. clear()
    清空字典中所有键值对,原字典变为空:

    python

    运行

    d = {"a": 1}
    d.clear()  # 原字典变为 {}
    
  6. setdefault(key[, default])
    若键不存在,则添加键值对(key: default),原字典被修改:

    python

    运行

    d = {"a": 1}
    d.setdefault("b", 2)  # 原字典变为 {"a": 1, "b": 2}
    

  7. del 语句
    通过 del dict[key] 直接删除指定键:

    python

    运行

    d = {"a": 1}
    del d["a"]  # 原字典变为 {}
    

这些操作都会直接修改原字典本身,而非返回新字典。如果需要保持原字典不变,可先使用 copy() 方法创建副本后再操作。

4 正则表达式中字符集([])的用法

下面字符串中匹配正则的有?mstr = r"red hed ced ped"
regex = r"[^c|p]ed"
pattern = re.compile(regex)
print pattern.findall(mstr)A red
B hed
C ced
D ped正确答案:AB

首先看正则表达式:r"[^c|p]ed"

这里的关键是 [^c|p] 这个部分,我们拆开来理解:

  1. [] 表示 “字符集”,匹配其中任意一个字符
  2. ^ 放在字符集开头,表示 “取反”,即 “不匹配后面的字符”
  3. 所以 [^c|p] 的意思是:匹配一个 “既不是 c、也不是 |、也不是 p” 的字符
    (注意:| 在这里只是一个普通字符,不是 “或” 的意思,因为在字符集里|没有特殊含义)

再看被匹配的字符串:"red hed ced ped"

里面有 4 个以 ed 结尾的子串,我们逐个检查:

  1. red:前面的字符是 r
    r 既不是 c、也不是 |、也不是 p,符合 [^c|p],所以会被匹配。

  2. hed:前面的字符是 h
    h 既不是 c、也不是 |、也不是 p,符合 [^c|p],所以会被匹配。

  3. ced:前面的字符是 c
    c 是 [^c|p] 中明确排除的字符,不符合,所以不会被匹配。

  4. ped:前面的字符是 p
    p 也是 [^c|p] 中明确排除的字符,不符合,所以不会被匹配。

结论

符合正则表达式 r"[^c|p]ed" 的只有 red 和 hed,对应选项 A、B

补充说明

如果想表达 “不是 c 也不是 p”,正确的写法应该是 [^cp](去掉 |),因为 | 在字符集里是普通字符,会被当成 “需要排除的字符” 之一。原正则 [^c|p] 多排除了一个 |,但不影响这道题的结果(因为字符串里没有 |)。(看来是起到迷惑作用的)

理解字符集的 “取反” 逻辑是关键,多练习几个例子就会熟悉啦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93590.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93590.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93590.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对于QPS的理解和简单

QPS&#xff08;Queries Per Second&#xff09; 是衡量系统吞吐量的核心指标&#xff0c;表示每秒能处理的请求数量。以下是关于QPS的完整解析和实践指南&#xff1a;一、QPS的核心公式 QPS 总请求量 / 请求总时间&#xff08;秒&#xff09;典型场景计算&#xff1a; 日请求…

【笔记ing】考试脑科学 脑科学中的高效记忆法

前言本书是拙作《高中生学习法》的修订版。《高中生学习法》出版已有十余年。这期间&#xff0c;脑科学研究不断进步&#xff0c;十几年前无法解释的事情现在已经开始逐渐明晰。同时&#xff0c;书中有些内容甚至已经被明确证实是错误的。也就是说&#xff0c;《高中生学习法》…

Web安全 - 构建安全可靠的API:基于国密SM2/SM3的文件上传方案深度解析

文章目录概述1. 缘起&#xff1a;挑战与目标2 . 核心架构&#xff1a;非对称签名与摘要算法的珠联璧合威胁模型&#xff08;我们要防的攻击&#xff09;密钥管理体系3 . 签名与验证&#xff1a;一步一解&#xff0c;安全闭环3.1 A系统&#xff1a;签名的生成&#xff08;请求前…

【MyBatis-Plus】一、快速入门

这里写自定义目录标题MyBatis-Plus 概述快速入门入门案例常用注解常见配置MyBatis-Plus 概述 MyBatis-Plus 简介&#xff1a; MyBatis-Plus 是在 MyBatis 基础上开发的一个 增强工具包&#xff0c;它简化了 MyBatis 的开发&#xff0c;减少了大量重复代码。它保持了 MyBatis …

PostgreSQL导入mimic4

一、PostgreSQL连接验证 正确连接命令 使用psql工具连接目标数据库&#xff0c;格式为&#xff1a;psql -h 127.0.0.1 -U 用户名 -d 数据库名 --password 示例&#xff08;用户名Shinelon&#xff0c;数据库mimic&#xff09;&#xff1a;psql -h 127.0.0.1 -U Shinelon -d mi…

css中 hsl() 的用法

好的 &#x1f44d; 我来详细介绍一下 CSS hsl() 的用法。1. 基本语法 color: hsl(hue, saturation, lightness);hue&#xff08;色相&#xff09; 取值范围&#xff1a;0 ~ 360&#xff08;角度值&#xff0c;代表色环的角度&#xff09;0 或 360 → 红色120 → 绿色240 → 蓝…

企业级Spring事务管理:从单体应用到微服务分布式事务完整方案

企业级Spring事务管理&#xff1a;从单体应用到微服务分布式事务完整方案 &#x1f31f; 你好&#xff0c;我是 励志成为糕手 &#xff01; &#x1f30c; 在代码的宇宙中&#xff0c;我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光&#xff0c;在逻辑的土…

继续记录面试题

坐在工位&#xff0c;没事干心慌的不行&#xff0c;可能也是房贷压的。一闲下来就开始胡思乱想&#xff0c;无法沉下心去背那些八股文。这才刚刚接到离职通知第三天啊。而且、我还在坐班呢&#xff01;&#xff01;&#xff01; 哎、怪不得有句老话说的&#xff0c;人穷志短&a…

从零开始学习:深度学习(基础入门版)(第2天)

&#xff08;一&#xff09;在pycharm软件中&#xff0c;用python语言&#xff0c;opencv库实现以下功能(1.1)图片的边界填充核心流程&#xff1a;读取原始图像使用 cv2.imread() 加载名为 yueshan.png 的图像文件统一边界参数设定四周留白尺寸均为 50px&#xff08;上下左右各…

HTTP协议-3-HTTP/2是如何维持长连接的?

先说结论&#xff1a;HTTP/2的“长连接” 一个TCP连接 多路复用 二进制帧 流控制 持久会话管理 它不只是“连接不断”&#xff0c;更关键的是&#xff1a;在这个长连接上&#xff0c;可以同时并发传输成百上千个请求和响应&#xff0c;互不阻塞&#xff01; 1、HTTP/2的“…

图解希尔排序C语言实现

1 希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是D.L.Shell于1959年提出来的一种排序算法&#xff0c;在这之前排序算法的时间复杂度基本都是O(n)&#xff0c;希尔排序算法是突破这个时间复杂度的第一批算法之一。 1.1 基本概念与原理 希尔排序通过将原始列表分割成若…

网络协议——HTTPS协议

目录 一、HTTPS是什么 加密是什么 二、HTTPS的工作过程 &#xff08;一&#xff09;对称加密 &#xff08;二&#xff09;非对称加密 &#xff08;三&#xff09;在非对称加密的基础上&#xff0c;引入证书校验 证书是什么 证书的内容 用证书解决中间人攻击 三、总结 …

React 基础实战:从组件到案例全解析

React 基础实战专栏:从组件到案例全解析 本专栏围绕 React 核心概念(组件、Props、State、生命周期)展开,通过 6个实战案例+核心知识点拆解,帮你掌握 React 基础开发逻辑,每篇聚焦1个实战场景,搭配完整代码与原理讲解,适合 React 入门者巩固基础。 专栏目录 【组件传…

ARM芯片架构之CoreSight Channel Interface 介绍

CoreSight Channel Interface&#xff08;通道接口&#xff09;详解1. 概述 Channel Interface 是 ARM CoreSight 架构中用于在不同组件之间传递触发事件的专用接口。它是 Event Interface 的增强版本&#xff0c;支持多通道、双向通信&#xff0c;以及同步与异步两种时钟域连接…

Blender模拟结构光3D Scanner(二)投影仪内参数匹配

关于投影仪外参的设置可参见前一篇文章 Blender模拟结构光3D Scanner&#xff08;一&#xff09;外参数匹配-CSDN博客 使用Projectors插件模拟投影仪 Step 1 在Github下载插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下载zip压缩包即可&#xff0c;无…

synchronized的作用

目录 一、核心作用 二、实现原理&#xff1a;基于"对象锁" 三、使用方式 四、锁的优化 五、优缺点 六、总结 synchronized 是 Java 中用于解决多线程并发安全问题的核心关键字&#xff0c;它的主要作用是实现线程间的同步&#xff0c;确保多个线程在访问共享资…

机试备考笔记 14/31

2025年8月14日 小结&#xff1a;&#xff08;17号整理14号的笔记&#xff0c;这辈子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好妈妈在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只学了10分钟嘻嘻 目录LeetCode22…

dolphinscheduler中任务输出变量的问题出现ArrayIndexOutOfBoundsException

一段脚本任务如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——边界填充、阈值处理

目录 一、边界填充&#xff08;Border Padding&#xff09; 1. 常见填充类型及效果 2.代码示例 &#xff08;1&#xff09;constant边界填充&#xff0c;填充指定宽度的像素 &#xff08;2&#xff09;REFLECT镜像边界填充 &#xff08;3&#xff09;REFLECT_101镜像边界…

Leetcode 15 java

今天复习一下翻转二叉树 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2…