Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / v9 / html / python / ref / assignment.html
CommitLineData
920dae64
AT
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2<html>
3<head>
4<link rel="STYLESHEET" href="ref.css" type='text/css' />
5<link rel="SHORTCUT ICON" href="../icons/pyfav.png" type="image/png" />
6<link rel='start' href='../index.html' title='Python Documentation Index' />
7<link rel="first" href="ref.html" title='Python Reference Manual' />
8<link rel='contents' href='contents.html' title="Contents" />
9<link rel='index' href='genindex.html' title='Index' />
10<link rel='last' href='about.html' title='About this document...' />
11<link rel='help' href='about.html' title='About this document...' />
12<link rel="next" href="pass.html" />
13<link rel="prev" href="assert.html" />
14<link rel="parent" href="simple.html" />
15<link rel="next" href="augassign.html" />
16<meta name='aesop' content='information' />
17<title>6.3 Assignment statements </title>
18</head>
19<body>
20<DIV CLASS="navigation">
21<div id='top-navigation-panel' xml:id='top-navigation-panel'>
22<table align="center" width="100%" cellpadding="0" cellspacing="2">
23<tr>
24<td class='online-navigation'><a rel="prev" title="6.2 Assert statements"
25 href="assert.html"><img src='../icons/previous.png'
26 border='0' height='32' alt='Previous Page' width='32' /></A></td>
27<td class='online-navigation'><a rel="parent" title="6. Simple statements"
28 href="simple.html"><img src='../icons/up.png'
29 border='0' height='32' alt='Up One Level' width='32' /></A></td>
30<td class='online-navigation'><a rel="next" title="6.3.1 Augmented assignment statements"
31 href="augassign.html"><img src='../icons/next.png'
32 border='0' height='32' alt='Next Page' width='32' /></A></td>
33<td align="center" width="100%">Python Reference Manual</td>
34<td class='online-navigation'><a rel="contents" title="Table of Contents"
35 href="contents.html"><img src='../icons/contents.png'
36 border='0' height='32' alt='Contents' width='32' /></A></td>
37<td class='online-navigation'><img src='../icons/blank.png'
38 border='0' height='32' alt='' width='32' /></td>
39<td class='online-navigation'><a rel="index" title="Index"
40 href="genindex.html"><img src='../icons/index.png'
41 border='0' height='32' alt='Index' width='32' /></A></td>
42</tr></table>
43<div class='online-navigation'>
44<b class="navlabel">Previous:</b>
45<a class="sectref" rel="prev" href="assert.html">6.2 Assert statements</A>
46<b class="navlabel">Up:</b>
47<a class="sectref" rel="parent" href="simple.html">6. Simple statements</A>
48<b class="navlabel">Next:</b>
49<a class="sectref" rel="next" href="augassign.html">6.3.1 Augmented assignment statements</A>
50</div>
51<hr /></div>
52</DIV>
53<!--End of Navigation Panel-->
54
55<H1><A NAME="SECTION008300000000000000000"></A><A NAME="assignment"></A>
56<BR>
576.3 Assignment statements
58</H1>
59
60<P>
61Assignment statements<a id='l2h-465' xml:id='l2h-465'></a> are used to
62(re)bind names to values and to modify attributes or items of mutable
63objects:
64<a id='l2h-466' xml:id='l2h-466'></a><a id='l2h-467' xml:id='l2h-467'></a><a id='l2h-468' xml:id='l2h-468'></a><a id='l2h-469' xml:id='l2h-469'></a>
65<P>
66<dl><dd class="grammar">
67<div class="productions">
68<table>
69<tr>
70 <td><a id='tok-assignment_stmt' xml:id='tok-assignment_stmt'>assignment_stmt</a></td>
71 <td>::=</td>
72 <td>(<a class='grammartoken' href="assignment.html#tok-target_list">target_list</a> "=")+ <a class='grammartoken' href="exprlists.html#tok-expression_list">expression_list</a></td></tr>
73 <tr>
74 <td><a id='tok-target_list' xml:id='tok-target_list'>target_list</a></td>
75 <td>::=</td>
76 <td><a class='grammartoken' href="assignment.html#tok-target">target</a> ("," <a class='grammartoken' href="assignment.html#tok-target">target</a>)* [","]</td></tr>
77 <tr>
78 <td><a id='tok-target' xml:id='tok-target'>target</a></td>
79 <td>::=</td>
80 <td><a class='grammartoken' href="identifiers.html#tok-identifier">identifier</a></td></tr>
81 <tr>
82 <td></td>
83 <td></td>
84 <td><code>| "(" <a class='grammartoken' href="assignment.html#tok-target_list">target_list</a> ")"</code></td></tr>
85 <tr>
86 <td></td>
87 <td></td>
88 <td><code>| "[" <a class='grammartoken' href="assignment.html#tok-target_list">target_list</a> "]"</code></td></tr>
89 <tr>
90 <td></td>
91 <td></td>
92 <td><code>| <a class='grammartoken' href="attribute-references.html#tok-attributeref">attributeref</a></code></td></tr>
93 <tr>
94 <td></td>
95 <td></td>
96 <td><code>| <a class='grammartoken' href="subscriptions.html#tok-subscription">subscription</a></code></td></tr>
97 <tr>
98 <td></td>
99 <td></td>
100 <td><code>| <a class='grammartoken' href="slicings.html#tok-slicing">slicing</a></code></td></tr>
101</table>
102</div>
103<a class="grammar-footer"
104 href="grammar.txt" type="text/plain"
105 >Download entire grammar as text.</a>
106</dd></dl>
107
108<P>
109(See section&nbsp;<A href="primaries.html#primaries">5.3</A> for the syntax definitions for the last
110three symbols.)
111
112<P>
113An assignment statement evaluates the expression list (remember that
114this can be a single expression or a comma-separated list, the latter
115yielding a tuple) and assigns the single resulting object to each of
116the target lists, from left to right.
117<a id='l2h-470' xml:id='l2h-470'></a>
118<P>
119Assignment is defined recursively depending on the form of the target
120(list). When a target is part of a mutable object (an attribute
121reference, subscription or slicing), the mutable object must
122ultimately perform the assignment and decide about its validity, and
123may raise an exception if the assignment is unacceptable. The rules
124observed by various types and the exceptions raised are given with the
125definition of the object types (see section&nbsp;<A href="types.html#types">3.2</A>).
126<a id='l2h-482' xml:id='l2h-482'></a>
127<a id='l2h-471' xml:id='l2h-471'></a>
128<P>
129Assignment of an object to a target list is recursively defined as
130follows.
131<a id='l2h-472' xml:id='l2h-472'></a>
132<P>
133
134<UL>
135<LI>If the target list is a single target: The object is assigned to that
136target.
137
138<P>
139</LI>
140<LI>If the target list is a comma-separated list of targets: The object
141must be a sequence with the same number of items as there are
142targets in the target list, and the items are assigned, from left to
143right, to the corresponding targets. (This rule is relaxed as of
144Python 1.5; in earlier versions, the object had to be a tuple. Since
145strings are sequences, an assignment like "<tt class="samp">a, b = "xy"</tt>" is
146now legal as long as the string has the right length.)
147
148<P>
149</LI>
150</UL>
151
152<P>
153Assignment of an object to a single target is recursively defined as
154follows.
155
156<P>
157
158
159<UL>
160<LI>If the target is an identifier (name):
161
162<P>
163
164<UL>
165<LI>If the name does not occur in a <tt class="keyword">global</tt> statement in the current
166code block: the name is bound to the object in the current local
167namespace.
168<a id='l2h-473' xml:id='l2h-473'></a>
169<P>
170</LI>
171<LI>Otherwise: the name is bound to the object in the current global
172namespace.
173
174<P>
175</LI>
176</UL>
177<P>
178The name is rebound if it was already bound. This may cause the
179reference count for the object previously bound to the name to reach
180zero, causing the object to be deallocated and its
181destructor<a id='l2h-483' xml:id='l2h-483'></a> (if it has one) to be called.
182
183<P>
184</LI>
185<LI>If the target is a target list enclosed in parentheses or in square
186brackets: The object must be a sequence with the same number of items
187as there are targets in the target list, and its items are assigned,
188from left to right, to the corresponding targets.
189
190<P>
191</LI>
192<LI>If the target is an attribute reference: The primary expression in the
193reference is evaluated. It should yield an object with assignable
194attributes; if this is not the case, <tt class="exception">TypeError</tt> is raised. That
195object is then asked to assign the assigned object to the given
196attribute; if it cannot perform the assignment, it raises an exception
197(usually but not necessarily <tt class="exception">AttributeError</tt>).
198<a id='l2h-474' xml:id='l2h-474'></a>
199<P>
200</LI>
201<LI>If the target is a subscription: The primary expression in the
202reference is evaluated. It should yield either a mutable sequence
203object (such as a list) or a mapping object (such as a dictionary). Next,
204the subscript expression is evaluated.
205<a id='l2h-475' xml:id='l2h-475'></a><a id='l2h-476' xml:id='l2h-476'></a>
206<P>
207If the primary is a mutable sequence object (such as a list), the subscript
208must yield a plain integer. If it is negative, the sequence's length
209is added to it. The resulting value must be a nonnegative integer
210less than the sequence's length, and the sequence is asked to assign
211the assigned object to its item with that index. If the index is out
212of range, <tt class="exception">IndexError</tt> is raised (assignment to a subscripted
213sequence cannot add new items to a list).
214<a id='l2h-477' xml:id='l2h-477'></a><a id='l2h-478' xml:id='l2h-478'></a>
215<P>
216If the primary is a mapping object (such as a dictionary), the subscript must
217have a type compatible with the mapping's key type, and the mapping is
218then asked to create a key/datum pair which maps the subscript to
219the assigned object. This can either replace an existing key/value
220pair with the same key value, or insert a new key/value pair (if no
221key with the same value existed).
222<a id='l2h-479' xml:id='l2h-479'></a><a id='l2h-480' xml:id='l2h-480'></a>
223<P>
224</LI>
225<LI>If the target is a slicing: The primary expression in the reference is
226evaluated. It should yield a mutable sequence object (such as a list). The
227assigned object should be a sequence object of the same type. Next,
228the lower and upper bound expressions are evaluated, insofar they are
229present; defaults are zero and the sequence's length. The bounds
230should evaluate to (small) integers. If either bound is negative, the
231sequence's length is added to it. The resulting bounds are clipped to
232lie between zero and the sequence's length, inclusive. Finally, the
233sequence object is asked to replace the slice with the items of the
234assigned sequence. The length of the slice may be different from the
235length of the assigned sequence, thus changing the length of the
236target sequence, if the object allows it.
237<a id='l2h-481' xml:id='l2h-481'></a>
238<P>
239</LI>
240</UL>
241
242<P>
243(In the current implementation, the syntax for targets is taken
244to be the same as for expressions, and invalid syntax is rejected
245during the code generation phase, causing less detailed error
246messages.)
247
248<P>
249WARNING: Although the definition of assignment implies that overlaps
250between the left-hand side and the right-hand side are `safe' (for example
251"<tt class="samp">a, b = b, a</tt>" swaps two variables), overlaps <em>within</em> the
252collection of assigned-to variables are not safe! For instance, the
253following program prints "<tt class="samp">[0, 2]</tt>":
254
255<P>
256<div class="verbatim"><pre>
257x = [0, 1]
258i = 0
259i, x[i] = 1, 2
260print x
261</pre></div>
262
263<P>
264
265<p><br /></p><hr class='online-navigation' />
266<div class='online-navigation'>
267<!--Table of Child-Links-->
268<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></a>
269
270<UL CLASS="ChildLinks">
271<LI><A href="augassign.html">6.3.1 Augmented assignment statements</a>
272</ul>
273<!--End of Table of Child-Links-->
274</div>
275
276<DIV CLASS="navigation">
277<div class='online-navigation'>
278<p></p><hr />
279<table align="center" width="100%" cellpadding="0" cellspacing="2">
280<tr>
281<td class='online-navigation'><a rel="prev" title="6.2 Assert statements"
282 href="assert.html"><img src='../icons/previous.png'
283 border='0' height='32' alt='Previous Page' width='32' /></A></td>
284<td class='online-navigation'><a rel="parent" title="6. Simple statements"
285 href="simple.html"><img src='../icons/up.png'
286 border='0' height='32' alt='Up One Level' width='32' /></A></td>
287<td class='online-navigation'><a rel="next" title="6.3.1 Augmented assignment statements"
288 href="augassign.html"><img src='../icons/next.png'
289 border='0' height='32' alt='Next Page' width='32' /></A></td>
290<td align="center" width="100%">Python Reference Manual</td>
291<td class='online-navigation'><a rel="contents" title="Table of Contents"
292 href="contents.html"><img src='../icons/contents.png'
293 border='0' height='32' alt='Contents' width='32' /></A></td>
294<td class='online-navigation'><img src='../icons/blank.png'
295 border='0' height='32' alt='' width='32' /></td>
296<td class='online-navigation'><a rel="index" title="Index"
297 href="genindex.html"><img src='../icons/index.png'
298 border='0' height='32' alt='Index' width='32' /></A></td>
299</tr></table>
300<div class='online-navigation'>
301<b class="navlabel">Previous:</b>
302<a class="sectref" rel="prev" href="assert.html">6.2 Assert statements</A>
303<b class="navlabel">Up:</b>
304<a class="sectref" rel="parent" href="simple.html">6. Simple statements</A>
305<b class="navlabel">Next:</b>
306<a class="sectref" rel="next" href="augassign.html">6.3.1 Augmented assignment statements</A>
307</div>
308</div>
309<hr />
310<span class="release-info">Release 2.4.2, documentation updated on 28 September 2005.</span>
311</DIV>
312<!--End of Navigation Panel-->
313<ADDRESS>
314See <i><a href="about.html">About this document...</a></i> for information on suggesting changes.
315</ADDRESS>
316</BODY>
317</HTML>