python with语句中的变量有作用域吗?

一直以为python中的with语句中的变量,只在with语句块中起作用。不然为什么要缩进一个级别呢?

呵呵,然而并没有为with语句内的变量创建新的作用域。

举例:

# test.py

with open('test.txt', 'w') as fout:
    a = 12
    line = 'test line\n'
    fout.write(line)

print('a=', a)  #这里访问了a变量,会报错吗?并不会。

执行上述代码,发现最后一行的print语句并没有报错,因为with并没有为a新创建作用域。

类似的写法,出现在tensorflow eager入门教程的求导函数中:

def grad(model, inputs, targets):
    with tf.GradientTape() as tape:
        loss_value = loss(model, inputs, targets)
    return tape.gradient(loss_value, model.variables)       #这里使用到了tape

原文地址:https://www.cnblogs.com/zjutzz/p/9314255.html

时间: 2024-08-06 12:24:18

python with语句中的变量有作用域吗?的相关文章

js和PHP等脚本语言for循环和if语句里面定义变量的作用域

在js和PHP等脚本语言中for循环中的定义变量,会先把var l 提到for循环外面,(只会定义一次l),所以for循环外面可以输出l var a=0; if(a==0) { var i=1; } alert(i); for(var j=0;j 在c#等语言中 for(int i=0;ijs和PHP等脚本语言for循环和if语句里面定义变量的作用域

thinkphp where语句中的变量不解析

解决办法:将where语句中的变量用单引号引起来就行了,亲测可用 举例:将$System->where("keywords=$keywords")->find();改为$System->where("keywords='$keywords'")->find();即可 原因:不明

python中如何使用shell命令, 及python 与shell 中的变量相互通信

1. python中使用shell命令有多种方法,我自己觉得比较好用的是用commands模块: import commands a,b = commands.getstatusoutput("ls -Al") a是退出状态(int类型), b是shell 命令的输出结果 python -> shell: 1.环境变量 import os  var=123或var='123'os.environ['var']=str(var)  #environ的键值必须是字符串   os.sy

javascript中的变量、作用域和内存问题

[变量][1]定义:可变的量,相当于给一个不定的数据起了一个外号.变量是存储信息的容器.[2]特性:js中的变量是松散类型的,可以保存任何类型的数据.它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变.[3]变量声明:变量可以在声明时赋值,但不能有其他操作,如+=.-=等 var a = 2;//是正确的 var a += 2;//是错误的 var a = 2++;//是错误的,++只能用于变量,不能

C++中switch 语句中的变量声明和

switch 内部的变量定义: 1 int i = 1; 2 switch(i) 3 { 4 case 0: 5 string str; //error 6 int val1 = 0; //error 7 int val2; //right 8 int val3; val3 = 0; //right 9 case 1: 10 val2 = 9; 11 cout << val2 << endl; 12 } <C++ Primer> P163: 如果在某处一个带有初始值的变

一篇文章带你了解JavaScript中的变量,作用域和内存问题

作者 | Jeskson 来源 | 达达前端小酒馆 1 在JavaScript中的变量分别区分为两种: 一种为基本类型值,一种为引用类型值. 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象,JavaScript不允许直接操作对象的内存空间,实际上操作对象的引用而不是实际对象. var dada = new Object(); undefined dada.name = "dada"; "dada" console.

在switch中的case语句中声明变量会被提前

原文链接:http://my.oschina.net/u/2000201/blog/514384 本人今天在编写工具类时,无意之间发现,在Java的Swith语句的case语句中声明局部变量时出现了一个奇怪的问题. 废话少说,先列出例子,一看便知. 情景一:case 1中声明变量x,case 2中不能再声明变量x switch (1) { case 1: int x = 1; break; case 2: int x = 2;// 编译器会提示:Duplicate local variable

mysql查询语句中用户变量的使用

先上代码吧 SELECT `notice`.`id` , `notice`.`fid` , `notice`.`has_read` , `notice`.`notice_time` , `notice`.`read_time` , `f`.`fnum` , `f`.`forg` , `f`.`fdst` , `f`.`actual_parking` AS `parking` , `f`.`scheduled_deptime` , `f`.`estimated_deptime` , `f`.`ac

在类中成员变量的作用域类型

作用域类型一共有四种 1,@public 在任何地方都能直接通过成员变量名直接访问成员变量.(不推荐使用) 2,@private 只能在当前类的对象方法中直接通过成员变量名访问成员变量,在其他地方需要通过geter和seter方法访问.(@implementation中被声明成员变量的默认类型) 3,@protected 只能在当前类及其子类的对象方法中直接通过成员变量名访问成员变量,在其他地方需要通过geter和seter方法访问.(@interface中被声明成员变量的默认类型) 4,@pa