分清==与is的使用场景

==用来检查两个对象是否相等,而is用来检查两个对象是否相同(是同一个对象)。

警告:不要将is用于数和字符串等不可变的基本值。

x = [1, 2, 3]
y = [2, 1]
del x[2]
y.reverse()

print(x == y, x is y)   # True False

# id()函数可以查看变量在内存中具体的存储空间
print(id(x), id(y)) # 2487285428808 2487285429512

is表示的是对象标示符(object identity),而==表示的意思是相等(equal)。

is的作用是用来检查对象的标示符是否一致的,也就是比较两个对象在内存中是否拥有同一块内存空间,它并不适合用来判断两个字符串是否相等。而==才是用来检查两个对象的值是否相等的,它实际调用内部__eq__()方法,因此a==b相当于a.__eq__(b),所以==操作符是可以被重载的,而is不能被重载。

一般情况下,如果x is y为True的话x == y的值也为True(特殊情况除外,如NaN),反之则不然。

a = float('NaN')

print(a is a, a == a)   # True False

Python中的string interning(字符串驻留)机制所决定的:对于较小的字符串,为了提高系统性能会保留其值的一个副本,当创建新的字符串的时候直接指向该副本即可。

# 不同变量组id()以及is和==的求值结果
a, b = "Watkins", "Watkins"
print(id(a), id(b))     # 2889860239856 2889860239856
print(a is b, a == b)   # True True

al = "Watkins" * 3
bl = "Watkins" * 3
print(id(al), id(bl))   # 2889861024984 2889862756944
print(al is bl, al == bl)   # False True

str1, str2 = "string", ''.join(['s', 't', 'r', 'i', 'n', 'g'])
print(id(str1), id(str2))   # 2889860357288 2889862775560
print(str1 is str2, str1 == str2)   # False True

(最近更新:2019年04月11日)

非常好的问题! 我们来详细分析: > ❓ **`-DarchetypeCatalog=internal`** `-Xverify:none` 或 JVM 字节码验证警告有关吗? --- ## ✅ 直接结论: > ❌ **完全没有关系。** `-DarchetypeCatalog=internal` 是 **Maven 命令行参数**,仅在 **创建项目时** 使用,对运行时、JVM 参数、字节码验证等 **完全无影响**。 --- ## 🔍 详细解释:`-DarchetypeCatalog=internal` 到底是什么? ### 它的作用: 这是 Maven 在执行 `archetype:generate`(即创建项目骨架)时使用的参数,用于指定 ** archetype 模板列表的来源**。 ```bash mvn archetype:generate -DarchetypeCatalog=internal ``` ### 可选值说明: | 值 | 含义 | |----|------| | `remote` | 从远程仓库下载模板列表(默认,慢) | | `local` | 从本地仓库查找模板 | | `internal` | 使用 Maven 内置的一些常用模板(推荐) | 📌 使用 `internal` 可以避免网络请求、加快项目创建速度。 --- ### 示例场景: 当你运行如下命令创建 Spring Boot 项目时: ```bash mvn archetype:generate \ -DgroupId=com.example \ -DartifactId=demo \ -DarchetypeArtifactId=maven-archetype-webapp \ -DarchetypeCatalog=internal ``` 👉 Maven 会使用内置模板快速生成项目结构。 但一旦项目创建完成,这个参数就 **彻底失效了**,不会再参任何后续构建或运行过程。 --- ## 🚫 它不影响哪些东西? | 项目 | 是否受影响 | 说明 | |------|------------|------| | JVM 启动参数(如 `-Xverify:none`) | ❌ 不影响 | 完全不同层级 | | Spring Boot 运行行为 | ❌ 不影响 | 运行时早已脱离 archetype 阶段 | | `pom.xml` 构建配置 | ❌ 不影响 | archetypeCatalog 只在创建时用 | | IDEA 的 Run Configuration | ❌ 不影响 | 属于 IDE 独立配置 | | 类加载 / 字节码验证 | ❌ 不可能影响 | JVM 底层机制 | --- ## ✅ 类比理解 你可以把 `archetypeCatalog` 看作是: > “盖房子时用的建筑设计图目录” 而 `-Xverify:none` 是: > “施工过程中是否跳过安全质检流程” ➡️ 设计图目录选哪个,不会影响施工时的安全标准。 --- ## 💡 那为什么你会怀疑它相关? 可能是因为你在某个地方看到类似命令: ```bash mvn archetype:generate -DarchetypeCatalog=internal -Dxxx=yyy ``` 然后误以为所有 `-Dxxx` 参数都是“全局系统属性”,其实不是。 ### 区分清楚: - `-Dxxx=yyy` 在 **Maven 命令中**:通常是 Maven 属性(只在构建阶段有效) - `-Dxxx=yyy` 在 **Java 运行时**:才是 JVM 系统属性(影响 System.getProperty) 即使名字一样,也可能作用完全不同。 --- ## ✅ 总结 | 问题 | 回答 | |------|------| | `-DarchypeCatalog=internal` 是否导致 `-Xverify:none`? | ❌ 绝对无关 | | 它什么时候起作用? | ✅ 仅在 `mvn archetype:generate` 创建项目时 | | 项目创建后还有效吗? | ❌ 完全无效 | | 是否需要担心它带来安全风险? | ❌ 不需要 | | 如何正确理解这类 `-D` 参数? | ✅ 分清是 Maven 属性还是 JVM 系统属性 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值